﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;

namespace ErepIrcBot
{
    class Statystyki
    {
        Dictionary<int, Obywatel> obywatele = new Dictionary<int, Obywatel>();

        string prefix = "http://utils.tk/egov/daily-report/";

        string sufix = "/2";

        List<int> dni = new List<int>();

        private string stworzAdres(int dzien)
        {
            return prefix + dzien + sufix;
        }

        private void dodajDzien(int dzien)
        {
            if (!dni.Contains(dzien))
            {
                WebClient client = new WebClient();
                Stream stream = client.OpenRead(stworzAdres(dzien));
                StreamReader reader = new StreamReader(stream);
                string napis = reader.ReadToEnd();
                reader.Close();
                char[] sep = { ' ', '\n' };
                string[] podzielone = napis.Split(sep);
                foreach (string osoba in podzielone)
                {
                    parsujOsobe(osoba, dzien);
                }
                dni.Add(dzien);
            }
            
        }

        private void parsujOsobe(string osoba, int dzien)
        {
            char[] sep = { ','};
            string[] podzielone = osoba.Split(sep);
            if (podzielone.Length == 4)
            {
                int id;
                if (int.TryParse(podzielone[0], out id))
                {
                    Obywatel obywatel;
                    if (obywatele.ContainsKey(id))
                    {
                        obywatel = obywatele[id];
                    }
                    else
                    {
                        obywatel = new Obywatel(id, podzielone[1]);
                        obywatele.Add(id, obywatel);
                    }
                    int hity, dmg;
                    if ((int.TryParse(podzielone[2], out hity)) && (int.TryParse(podzielone[3], out dmg)))
                    {
                        obywatel.dodajDzien(dzien, dmg, hity);
                    }
                }
            }
        }

        public void dodajPrzedzial(int dzien1, int dzien2)
        {
            int pocz = Math.Min(dzien1, dzien2);
            int kon = Math.Max(dzien1, dzien2);
            for (int i = pocz; i <= kon; ++i)
            {
                dodajDzien(i);
            }
        }

        public List<string> wypiszDofa(List<int> dni, int kwota)
        {
            List<string> napisy = new List<string>();
            int sumaDmg = 0;
            double dofZa1Dmg;
            foreach (KeyValuePair<int, Obywatel> para in obywatele)
            {
                sumaDmg += para.Value.sumaDmg(dni);
            }
            dofZa1Dmg = (double)kwota / (double)sumaDmg;
            foreach (KeyValuePair<int, Obywatel> para in obywatele)
            {
                string napis = para.Value.wypiszDof(dni, dofZa1Dmg);
                if (!String.IsNullOrEmpty(napis))
                    napisy.Add(napis);
            }
            return napisy;
        }

        public Statystyki()
        {
            
        }

        public List<string> wypisz(List<int> dni){
            List<string> napisy = new List<string>();
            foreach (KeyValuePair<int, Obywatel> para in obywatele)
            {
                napisy.AddRange(para.Value.podsumowanie(dni));
            }
            return napisy;
        }
    }
}
